package HASH_TABLE

/*
给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target  的那 两个 整数，并返回它们的数组下标。

你可以假设每种输入只会对应一个答案，并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

示例 1：

输入：nums = [2,7,11,15], target = 9
输出：[0,1]
解释：因为 nums[0] + nums[1] == 9 ，返回 [0, 1] 。
示例 2：

输入：nums = [3,2,4], target = 6
输出：[1,2]
示例 3：

输入：nums = [3,3], target = 6
输出：[0,1]
*/
//type numWithIndex struct {
//	val int
//	idx int
//}

//	func twoSum(nums []int, target int) []int {
//		//for 双层暴力解
//		//for i := 0; i < len(nums); i++ {
//		//	for j := i + 1; j < len(nums); j++ {
//		//		if nums[i]+nums[j] == target {
//		//			return []int{i, j}
//		//		}
//		//
//		//	}
//		//}
//		//return nil
//		//-----------------------------------
//		//排序+ 双指针
//		arr := make([]numWithIndex, len(nums))
//		for i, val := range nums {
//			arr[i] = numWithIndex{val: val, idx: i}
//		}
//		//排序
//		sort.Slice(arr, func(i, j int) bool {
//			return arr[i].val < arr[j].val
//		})
//		//双指针
//		left, right := 0, len(arr)-1
//		for left < right {
//			currentSum := arr[left].val + arr[right].val
//			if currentSum == target {
//				return []int{arr[left].idx, arr[right].idx}
//			} else if currentSum < target {
//				left++
//			} else {
//				right--
//			}
//		}
//		return nil
//	}
func twoSum(nums []int, target int) []int {
	numMap := make(map[int]int)
	for i, val := range nums {
		c := target - val
		if j, exists := numMap[c]; exists {
			return []int{i, j}
		}
		numMap[val] = i
	}
	return nil
}
